#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QCameraDevice> // 用于摄像头设备
#include <QList>         // 用于存储摄像头列表

// 前置声明 Qt 控件类，减少头文件包含
class QLabel;
class QLineEdit;
class QComboBox;
class QPushButton;
class QFormLayout;
class QHBoxLayout;
class QVBoxLayout;
class QRadioButton; // 添加单选按钮
class QStackedWidget; // 添加堆叠窗口
class QGroupBox;     // 用于分组 UI

// 前置声明自定义类
// class CWebSocket;
class JanusClient;     // 使用 JanusClient 基类
class VideoMeetingUI;
class CCamera; // 添加 CCamera 前置声明
struct AVFrame; // VideoMeetingUI 可能需要

#include "../WebRTC/janusclient.h" // <<<=== 包含 JanusClient 定义
#include "../UI/videomeetingui.h" // 会议界面类
#include "../Camera/CCamera.h"   // 包含定义

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr); // explicit 构造函数
    ~Widget() override; // 显式声明析构函数为 override

private slots:
    // --- 模式切换 ---
    void onModeChanged(); // 当选择 VideoCall 或 VideoRoom 时调用


    // --- 按钮槽函数 ---
    void on_registerButton_clicked();  // VideoCall: 注册按钮
    void on_startSession_clicked(); // 通用: VideoRoom 的 "加入" 或 VideoCall 的 "呼叫" 按钮
    void on_exitButton_clicked();

    // --- JanusClient 信号处理槽函数 ---
    void onJanusStateChanged(JanusClient::State newState);
    void onJanusSessionCreated(long long sessionId);
    void onJanusErrorOccurred(const QString& errorString);

    // --- 会议界面关闭 ---
    void onMeetingUiClosed();

    // --- CCamera 相关的槽函数 ---
    void updateCameraComboBox(const QStringList& descriptions); // 更新摄像头下拉列表
    void onCameraSelected(int index);                          // 处理摄像头选择变化
    void onCameraError(const QString& errorString);            // 处理摄像头错误

private:
    // --- 私有方法 ---
    void setupUi();              // 创建和布局 UI 元素
    void setupVideoRoomUi(QWidget* parent); // 创建 VideoRoom UI 部分
    void setupVideoCallUi(QWidget* parent); // 创建 VideoCall UI 部分
    bool validateInputs(QString& errorMsg); // 验证输入

    // --- UI 模式选择 ---
    enum class UIMode {
        VideoRoom,
        VideoCall
    };
    UIMode currentMode_ = UIMode::VideoRoom; // 默认模式

    QGroupBox* modeSelectionGroup_ = nullptr;
    QRadioButton* videoRoomRadioButton_ = nullptr;
    QRadioButton* videoCallRadioButton_ = nullptr;

    // --- 通用 UI 控件 ---
    QLabel* janusUrlLabel_ = nullptr;
    QLineEdit* janusUrlLineEdit_ = nullptr;
    QLabel* cameraLabel_ = nullptr;
    QComboBox* cameraComboBox_ = nullptr;
    QPushButton* exitButton_ = nullptr;

    // --- 堆叠窗口和特定模式的 UI ---
    QStackedWidget* stackedWidget_ = nullptr;

    // VideoRoom UI (放在一个容器 Widget 中)
    QWidget* videoRoomWidget_ = nullptr;
    QLabel* roomIdLabel_ = nullptr;
    QLineEdit* roomIdLineEdit_ = nullptr;
    QPushButton* joinRoomButton_ = nullptr; // "加入" 按钮

    // VideoCall UI (放在一个容器 Widget 中)
    QWidget* videoCallWidget_ = nullptr;
    QLabel* userNameLabel_ = nullptr;
    QLineEdit* userNameLineEdit_ = nullptr;
    QPushButton* registerButton_ = nullptr; // "注册" 按钮
    QLabel* peerUserNameLabel_ = nullptr;
    QLineEdit* peerUserNameLineEdit_ = nullptr;
    QPushButton* callButton_ = nullptr; // "呼叫" 按钮

    // --- 布局管理器 ---
    QVBoxLayout* mainLayout_ = nullptr;

    // --- 逻辑和数据成员 ---
    JanusClient* janusClient_ = nullptr; // <<<=== 使用 JanusClient 指针
    CCamera* camera_ = nullptr;
    VideoMeetingUI* meetingUI_ = nullptr;
    bool isRegistered_ = false; // VideoCall 模式下是否已注册
};
#endif // WIDGET_H
